package com.opc.Config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

//默认情况下，@Async 使用 SimpleAsyncTaskExecutor。你可以自定义线程池以提高性能。
@Configuration  
@EnableAsync
//启用 Spring 的异步方法执行功能。
//开启后，可以使用 @Async 注解标记的方法将在后台线程中执行，而不会阻塞主线程。
//需要与线程池配合使用，具体使用哪种线程池通过 bean 的定义来设置。
public class AsyncConfig implements AsyncConfigurer {
//    @Bean(name = "taskExecutor") //表示taskExecutor() 方法返回的 Executor 对象会作为一个 bean 被注册到 Spring 容器中。
//    public Executor taskExecutor() {
//        //创建一个 ThreadPoolTaskExecutor 实例，该类是 Spring 提供的线程池实现，支持异步任务的执行
//        //默认情况下，使用的是 JDK 的 ThreadPoolExecutor。
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        //设置核心线程数为 5。在这个线程池中，始终有 5 个线程处于活动状态，直到线程池被关闭。
//        executor.setCorePoolSize(5);
//        //设置最大线程数为 10。当请求的任务数量超过核心线程数时，最多可以扩展到 10 个线程。
//        executor.setMaxPoolSize(10);
//        //设置任务队列的容量为 100。
//        // 如果所有核心线程忙碌，
//        // 新增任务将被放入这个队列中。
//        // 如果队列满了并且线程数未达到最大值，
//        // 线程池将会创建新的线程来处理任务。
//        executor.setQueueCapacity(100);
//        //初始化线程池。在 Spring Boot 启动时会自动调用此方法,
//        // 可以根据具体的需要设置更多的初始化参数。
//        executor.initialize();
//        //返回配置好的 ThreadPoolTaskExecutor 实例，
//        // 这样就可以在 Spring 的上下文中使用它来执行异步任务了。
//        return executor;
//    }
//---
    // 显式指定 executor
    //@Async("asyncExecutor")  // 明确使用 AsyncConfig 中的线程池
        @Override
        @Bean(name = "asyncExecutor")
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(6);
            executor.setMaxPoolSize(10);
            executor.setQueueCapacity(100);
            executor.setThreadNamePrefix("AsyncJobExecutor-");
            executor.initialize();
            return executor;
        }

    // 给getHomeCache缓存配置专用线程池（建议添加此配置）
    @Bean(name = "cacheThreadPool")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 根据CPU核心数调整
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("cache-pool-");
        executor.initialize();
        return executor;
    }

    // 配置IO密集型线程池（建议添加此配置）
    @Bean(name = "ioIntensiveThreadPool")
    public Executor ioIntensiveThreadPool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20); // IO密集型应用可设置较大值
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("io-intensive-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }
}  